package de.htwg.main;

import java.util.concurrent.TimeUnit;

import desmoj.core.simulator.Model;
import desmoj.core.simulator.SimProcess;
import desmoj.core.simulator.TimeInstant;
import desmoj.core.simulator.TimeSpan;

public class AirplaneGenerator extends SimProcess {

	/**
	 * Airplane constructor.
	 * 
	 * Creates a new Airplane Generator SimProcess via calling the constructor of the
	 * superclass.
	 * 
	 * @param owner
	 *            Um auf alle Queues und Datenwerte zugreifen zu koennen
	 * @param name
	 *            Der Name des Generators
	 * @param showInTrace
	 *            Signalisiert, ob diese Klasse einen Trace aufzeichnen soll
	 */
	public AirplaneGenerator(Model owner, String name, boolean arg2) {
		super(owner, name, arg2);
	}

	/*
	 * Der Lifecycle beschreibt den Ablauf des Objektes, in diesem Fall wenn ein
	 * Flugzeug generiert wird. Hier muss man darauf achten, das die Flugzeuge
	 * zu den vorgeschriebenen bestimmten Zeiten auch landen
	 */
	@Override
	public void lifeCycle() {
		// Referenz des Modells wird hier gespeichert
		AirportProcess model = (AirportProcess) getModel();

		// Schleife die solange durchlaufen wird, bis es keine Landungen mer
		// gibt. (Nicht Unendlich, da man vorgibt, wie viele Flugzeuge am Tag
		// landen werden
		if(model.departureTimes.size() > model.arrivalTimes.size()) {
			int toDo = model.departureTimes.size() - model.arrivalTimes.size();
			for(int i = 0; i < toDo; i++) {
				Airplane planeNew = new Airplane(model, "Plane", true);
				planeNew.state = "parking";
				
				// Naechsten Abflug abrufen und ihn aus der Liste entfernen
				TimeInstant nextTime = model.departureTimes.get(0);
				model.departureTimes.remove(0);

				// Abflugszeit mit der Tolleranz verrechnen, die man ueber unser Model err (+- paar Minuten)
				nextTime = new TimeInstant(nextTime.getTimeAsDouble());
				
				// Das Flugzeug dann aktivieren, wenn die Zeit gekommen ist
				planeNew.activate(nextTime);
				
			}
		}
		while (!model.arrivalTimes.isEmpty()) {
			// Neues Flugzeug erstellen
			Airplane plane = new Airplane(model, "Plane", true);

			// Naechsten Abflug abrufen und ihn aus der Liste entfernen
			TimeInstant nextTime = model.arrivalTimes.get(0);
			model.arrivalTimes.remove(0);

			// Abflugszeit mit der Tolleranz verrechnen, die man ueber unser Model err (+- paar Minuten)
			double arrivalTolerance = model.getAirplaneArrivalTolerance();
			nextTime = new TimeInstant(arrivalTolerance
					+ nextTime.getTimeAsDouble());
			
			plane.state = "generator";
			// Das Flugzeug dann aktivieren, wenn die Zeit gekommen ist
			plane.activate(nextTime);

			// Den Generator zum naechsten eintreffen des Flugzeuges aktivieren
			// (Muss eig. nicht unbedingt gemacht werden, da wir das Flugzeug
			// erst dann aktivieren, wenn es auch landen soll)
			hold(new TimeSpan(0, TimeUnit.MINUTES));
		}
	}

}
